// 知识点1：函数指针指向的是函数并非对象。想要声明一个指向函数的指针只要用指针替代函数名即可

// bool (*pf) (const string &, const string
// &)//pf指向一个函数返回值类型为bool，此时还未初始化。pf两端的括号必不可少，若无括号，pf为一个返回值为bool指针的函数。

// 知识点2：当我们把函数名当作一个值使用时，函数自动的转换为指针，直接赋予或者取址皆可。可以直接使用只想该函数的指针调用该函数。
// 知识点3：给指针赋予nullptr或者0时，指针不指向任何函数。

// 知识点4：函数重载时，指针的类型必须与重载函数精确匹配，包括形参类型数量和返回值类型。

// 知识点5：虽然不能返回一个函数，但是可以返回一个指向函数的指针。

// int (*f(int))(int,
// int);//f有形参列表，f是个函数，f的返回值为指针，指针本身又有参数列表，因此指针指向的是函数，该函数的类型为int

// 给一个vector对象存入一个函数的指针，那么vector的类型即为函数的指针。
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int f(int a, int b) { return a + b; } //声明定义该函数

int (*a)(int, int);
int main(int argc, char **argv) {
  typedef int (*p)(
      int a,
      int b); //声明函数指针，未初始化,p为指向函数的指针。使用typedef的声明语句定义的不再是变量而是类型别名
  //就是将变量转化为类型别名的一种方式，p原来是指向函数的指针变量，现在变成了指向函数的指针变量的类型别名
  return 0;
}